package x.x.x;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class OverTimeMethod {

    
    public static void OverTime(){
        
        ExecutorService executor = Executors.newSingleThreadExecutor();
        
        //创建一个需要7s执行完成的任务
        FutureTask<String> future = new FutureTask<String>(
                new Callable<String>() {
                    @Override
                    public String call(){
                        System.err.println("begin");
                        try {
                            Thread.sleep(7000);
                        } catch (InterruptedException e) {
                            System.err.println("Thread InterruptedException!");
                        }
                        System.err.println("end");
                        return null;
                    }
                });//创建一个FutureTask,一旦运行就执行给定的Callable
        executor.execute(future);//在未来某个时间执行给定的命令
        try {
            //3秒之内没有完成则抛出异常
            future.get(3000,TimeUnit.MILLISECONDS);
        } catch (InterruptedException e) {
            //当线程在活动之前活或活动期间处于等待,休眠或占用状态且该线程被中断时,抛出该异常.
            //有时候,一种方法可能获得希望测试当前线程是否已经中断,如果已被中断,则立刻抛出此异常
            
            /*
             * 试图取消对此任务的执行。
             * 如果任务已完成、或已取消，或者由于某些其他原因而无法取消，则此尝试将失败。
             * 当调用 cancel 时，如果调用成功，而此任务尚未启动，则此任务将永不运行。
             * 如果任务已经启动，则 mayInterruptIfRunning 参数确定是否应该以试图停止任务的方式来中断执行此任务的线程。 
             */
            future.cancel(true);
            System.err.println("exec cancel InterruptedException!");
        } catch (ExecutionException e) {
            //当试图获取已通过抛出异常而中止的任务的结果时,抛出此异常
            future.cancel(true);
            System.err.println("exec cancel InterruptedException!");
        } catch (TimeoutException e) {
            //阻塞操作超时时,抛出该异常.对于指定超时的阻塞操作来说,需要一种指示发生超时的方法.
            //多数这样的操作可能返回一个值指示超时;当不可能或不需要返回超时值时,将声明并抛出此异常
            future.cancel(true);
            System.err.println("exec cancel TimeoutException!");
        } finally {
            //终止线程
            executor.shutdown();
            System.err.println("exec shutdown!");
        }
    }
    
    public static void main(String[] args) {
        OverTime();
    }
}
